﻿using System;
using System.Configuration;
using System.Configuration.Install;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Reflection;
using System.Text;
using System.Windows.Forms;

namespace InstaladorEleven
{
    public partial class FrmInstalador : Form
    {
        #region " Campos "

        private const int CP_NOCLOSE_BUTTON = 0x200;
        private string rutaInstalacion = "";

        #endregion

        #region " Constructor "

        public FrmInstalador(string rutaInstalacion)
        {
            InitializeComponent();
            this.rutaInstalacion = rutaInstalacion;
        }

        #endregion

        #region " Overrides "

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams myCp = base.CreateParams;
                myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
                return myCp;
            }
        }

        #endregion

        #region " Eventos Formulario "

        private void FrmInstalador_Load(object sender, EventArgs e)
        {
            cmbAutenticacion.SelectedIndex = 0;
            txtServidor.Focus();
        }

        private void btnCrear_Click(object sender, EventArgs e)
        {
            StringBuilder cadenaConexion = new StringBuilder();

            #region " Validaciones "

            if (string.IsNullOrEmpty(txtServidor.Text) || string.IsNullOrEmpty(txtBaseDatos.Text))
            {
                MessageBox.Show("No puede dejar campos en blanco en la conexión.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtServidor.Focus();
                return;
            }
            if (cmbAutenticacion.SelectedIndex == 0 && (string.IsNullOrEmpty(txtUsuarioBaseDatos.Text) || string.IsNullOrEmpty(txtContraseñaBaseDatos.Text)))
            {
                MessageBox.Show("Debe llenar el usuario y la contraseña para conectarse a la Base de Datos.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtUsuarioBaseDatos.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtNombreUsuario.Text) || string.IsNullOrEmpty(txtUsuario.Text) || string.IsNullOrEmpty(txtContraseñaUsuario.Text) || string.IsNullOrEmpty(txtRepetirContraseñaUsuario.Text))
            {
                MessageBox.Show("No puede dejar campos en blanco en los datos de usuario.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtNombreUsuario.Focus();
                return;
            }
            if (txtContraseñaUsuario.Text != txtRepetirContraseñaUsuario.Text)
            {
                MessageBox.Show("La contraseña de usuario y la verificación no coinciden.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtRepetirContraseñaUsuario.Focus();
                return;
            }

            #endregion

            #region " Creación de la nueva Base de Datos "

            if (chkCrearBaseDatos.Checked)
            {
                cadenaConexion.Append("Server=" + txtServidor.Text + "\\" + txtInstancia.Text + ";Database=master;");
                if (cmbAutenticacion.SelectedIndex == 0)
                    cadenaConexion.Append("UID=" + txtUsuarioBaseDatos.Text + ";PWD=" + txtContraseñaBaseDatos.Text + ";");
                else
                    cadenaConexion.Append("Integrated Security = SSPI");

                try
                {
                    using (SqlConnection conexion = new SqlConnection(cadenaConexion.ToString()))
                    {
                        SqlCommand comando = new SqlCommand("CREATE DATABASE " + txtBaseDatos.Text, conexion);
                        conexion.Open();
                        comando.ExecuteNonQuery();
                        if (conexion.State != ConnectionState.Closed)
                            conexion.Close();
                        comando = null;
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show("Error al crear la nueva base de datos.\n" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    if (MessageBox.Show("¿Desea cancelar la instalación?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                        throw new InstallException("Error al crear la nueva base de datos.", exc);
                    else
                        return;
                }
            }

            #endregion
//========================================== Script Eleven.sql
            cadenaConexion.Replace("Database=master", "Database=" + txtBaseDatos.Text);

            #region " Creación de la estructura "

            using (SqlConnection conexion = new SqlConnection(cadenaConexion.ToString()))
            {
                conexion.Open();
                using (SqlTransaction transaccion = conexion.BeginTransaction())
                {
                    using (SqlCommand comando = new SqlCommand("", conexion, transaccion))
                    {
                        try
                        {
                            string[] consultas = null;
                            consultas = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Eleven.sql").Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);

                            foreach (string stringQuery in consultas)
                            {
                                comando.CommandText = stringQuery;
                                comando.ExecuteNonQuery();
                            }

                            transaccion.Commit();
                        }
                        catch (Exception exc)
                        {
                            transaccion.Rollback();
                            MessageBox.Show("Ocurrió un error al tratar de crear la estructura de la Base de Datos.\n" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            if (MessageBox.Show("¿Desea cancelar la instalación?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                                throw new InstallException("Error al crear la estructura.", exc);
                            else
                                return;
                        }
                    }
				}
            }
//========================================== Final Script Eleven.sql
			
//========================================== Script Eleven1.sql
            cadenaConexion.Replace("Database=master", "Database=" + txtBaseDatos.Text);

            using (SqlConnection conexion = new SqlConnection(cadenaConexion.ToString()))
            {
                conexion.Open();
                using (SqlTransaction transaccion = conexion.BeginTransaction())
                {
                    using (SqlCommand comando = new SqlCommand("", conexion, transaccion))
                    {
                        try
                        {
                            string[] consultas_1 = null;
                            consultas_1 = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Eleven1.sql").Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);

                            foreach (string stringQuery in consultas_1)
                            {
                                comando.CommandText = stringQuery;
                                comando.ExecuteNonQuery();
                            }

                            transaccion.Commit();
                        }
                        catch (Exception exc)
                        {
                            transaccion.Rollback();
                            MessageBox.Show("Ocurrió un error al tratar de crear la estructura de la Base de Datos.\n" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            if (MessageBox.Show("¿Desea cancelar la instalación?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                                throw new InstallException("Error al crear la estructura.", exc);
                            else
                                return;
                        }
                    }
				}
            }
			
//========================================== Final Script Eleven1-sql

//========================================== Script Eleven2.sql
            cadenaConexion.Replace("Database=master", "Database=" + txtBaseDatos.Text);

            using (SqlConnection conexion = new SqlConnection(cadenaConexion.ToString()))
            {
                conexion.Open();
                using (SqlTransaction transaccion = conexion.BeginTransaction())
                {
                    using (SqlCommand comando = new SqlCommand("", conexion, transaccion))
                    {
                        try
                        {
                            string[] consultas_2 = null;
                            consultas_2 = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Eleven2.sql").Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);

                            foreach (string stringQuery in consultas_2)
                            {
                                comando.CommandText = stringQuery;
                                comando.ExecuteNonQuery();
                            }

                            transaccion.Commit();
                        }
                        catch (Exception exc)
                        {
                            transaccion.Rollback();
                            MessageBox.Show("Ocurrió un error al tratar de crear la estructura de la Base de Datos.\n" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            if (MessageBox.Show("¿Desea cancelar la instalación?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                                throw new InstallException("Error al crear la estructura.", exc);
                            else
                                return;
                        }
                    }
				}
            }
			
            #endregion
//========================================== Final Script Eleven2-sql

            #region " Creación del usuario "

            using (SqlConnection conexion = new SqlConnection(cadenaConexion.ToString()))
            {
                conexion.Open();
                using (SqlTransaction transaccion = conexion.BeginTransaction())
                {
                    using (SqlCommand comando = new SqlCommand("INSERT INTO [11USUARIO] VALUES(@Nombre,@Usuario,@Contraseña)", conexion, transaccion))
                    {
                        try
                        {
                            comando.Parameters.AddWithValue("Nombre", txtNombreUsuario.Text);
                            comando.Parameters.AddWithValue("Usuario", txtUsuario.Text);
                            comando.Parameters.AddWithValue("Contraseña", txtContraseñaUsuario.Text);

                            comando.ExecuteNonQuery();
                            transaccion.Commit();
                        }
                        catch (Exception exc)
                        {
                            transaccion.Rollback();
                            MessageBox.Show("Ocurrió un error al tratar de crear al usuario.\n" + exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }

            #endregion

            #region " Cambios en el App.config "
//          MessageBox.Show("Cadena de conexión: "+cadenaConexion.ToString(),"Aviso");
//          Configuration appConfig = ConfigurationManager.OpenExeConfiguration(rutaInstalacion + "Eleven.exe"); 
//			appConfig.ConnectionStrings.ConnectionStrings["BaseDatos"].ConnectionString = cadenaConexion.ToString();
//          appConfig.Save();

            #endregion

            MessageBox.Show("La base de datos fue creada correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            Close();
        }

        private void cmbAutenticacion_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtUsuarioBaseDatos.Enabled = (cmbAutenticacion.SelectedIndex == 0);
            txtContraseñaBaseDatos.Enabled = (cmbAutenticacion.SelectedIndex == 0);
        }

        #endregion
    }
}
